package br.com.ctm.advogadope.negocio.impl;

import java.util.Date;
import java.util.List;

import javax.ejb.ActivationConfigProperty;
import javax.ejb.MessageDriven;
import javax.inject.Inject;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import javax.persistence.PersistenceException;

import org.apache.log4j.Logger;

import br.com.ctm.advogadope.model.Advogado;
import br.com.ctm.advogadope.model.AdvogadoNotificacao;
import br.com.ctm.advogadope.model.Notificacao;
import br.com.ctm.advogadope.model.Processo;
import br.com.ctm.advogadope.negocio.api.AdvogadoNegocio;
import br.com.ctm.advogadope.negocio.api.AdvogadoNotificacaoNegocio;
import br.com.ctm.advogadope.negocio.api.NotificacaoNegocio;
import br.com.framework.negocio.exception.NegocioException;

@MessageDriven(name = "NotificacaoProcessualConsumer", activationConfig = {
		@ActivationConfigProperty(propertyName = "destination", propertyValue = "java:/queue/advogadope-queue"),
		@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
		@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "AUTO_ACKNOWLEDGE") })
public class NotificacaoProcessualMDB implements MessageListener {
	
	private static final Logger LOGGER = Logger.getLogger(NotificacaoProcessualMDB.class);
	
	@Inject
	private NotificacaoNegocio notificacaoNegocio;
	@Inject
	private AdvogadoNotificacaoNegocio advogadoNotificacaoNegocio;
	@Inject
	private AdvogadoNegocio advogadoNegocio;

	@Override
	public void onMessage(Message message) {
		if (message instanceof ObjectMessage) {
			ObjectMessage objMessage = (ObjectMessage) message;
			try {
				Processo processo = (Processo) objMessage.getObject();
				Notificacao notificacao = new Notificacao();
				notificacao.setDataNotificacao(new Date());
				notificacao.setDescricao("Houve movimentacao no processo.");
				notificacao.setProcesso(processo);
				notificacaoNegocio.insert(notificacao);
				List<Advogado> advogados = advogadoNegocio.findByProcesso(processo.getNpu(), -1, -1, true);
				if (LOGGER.isDebugEnabled())
					LOGGER.debug(String.format("Notificacao: %s clientes serão notificados da atualizacao.", advogados.size()));
				for (Advogado advogado : advogados) {
					AdvogadoNotificacao advNotif = new AdvogadoNotificacao();
					advNotif.setAdvogado(advogado);
					advNotif.setNotificacao(notificacao);
					advNotif.setVerificado(false);
					advogadoNotificacaoNegocio.insert(advNotif);
				}
				LOGGER.info("Notificacoes registradas com sucesso.");
			} catch (NegocioException e) {
				LOGGER.error("Falha de negocio ao registrar notificacoes.", e);
			} catch (PersistenceException e) {
				LOGGER.error("Falha de persistencia ao registrar notificacoes.", e);
			} catch (JMSException e) {
				LOGGER.error("Falha ao resgatar mensagem", e);
			}
		}
	}

}
